perm filename P3C.F4[P11,LCS]2 blob sn#347642 filedate 1978-04-07 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	CFORS3     FORTRAN UNIT GENERATOR ROUTINE     
C00017 ENDMK
CāŠ—;
CFORS3     FORTRAN UNIT GENERATOR ROUTINE     
C    *** MUSIC V ***     
      SUBROUTINE FORSAM   
      DIMENSION L(8),M(8)     
CC    DIMENSION I(15000),P(100),IP(20),L(8),M(8)     
      COMMON I(1)/P/ P(1)/PARM/IP(1)
CC    COMMONI,P/PARM/IP  
      EQUIVALENCE(M1,M(1)),(M2,M(2)),(M3,M(3)),(M4,M(4)),(M5,M(5)),(M6,M
     1(6)),(M7,M(7)),(M8,M(8)),(L1,L(1)),(L2,L(2)),(L3,L(3)),(L4,L(4)),(  
     2L5,L(5)),(L6,L(6)),(L7,L(7)),(L8,L(8)),(RN1,IRN1),(RN3,IRN3),(RN,I  
     3RN)  
	SFXX=FLOAT(IP(15))
      SFID=FLOAT(IP(12)) 
      SFI=1./SFID
      SFF=1./SFXX      
      SFXX=SFID/SFXX 
      XNFUN=IP(6)-1      
C     COMMON INITIALIZATION OF GENERATORS     
      N1=I(6)+2   
      N2=I(N1-1)-1
      DO 204 J1=N1,N2      
      J2=J1-N1+1  
	IF(I(J1).GE.0)GO TO 201
CCC   IF(I(J1))200,201,201      
 200  L(J2)=-I(J1)
      M(J2)=1     
      GO TO 204     
 201  M(J2)=0     
   	IF(I(J1)-26262.GT.0)GO TO 203
C     IF(I(J1)-26262)202,202,203      
CCC   IF(I(J1)-262144)202,202,203      
C***** WHAT DOES THE BIG NUMBER DO?????
C*** IT SEEMS TO BE JUST TO MAKE A FLAG. NOW CHANGED TO FIT INTO 16BITS.
 202  L(J2)=I(J1)+I(3)-1 
      GO TO 204     
 203  L(J2)=I(J1)-26262  
CCC203	L(J2)=I(J1)-262144 
C****** WHAT DOES THIS BIG NUM. DO?? ***********
 204  CONTINUE    
      NSAM=I(5)   
      N3=I(N1-2)  
      NGEN=  N3 -100     
      GO TO (101,102,103,104,105,106,107,108,109,110,111,112),NGEN   
 112  RETURN      
C     UNIT GENERATORS    
C     OUTPUT BOX  
 101  IF(M1.GT.0)GO TO 261  
CCC 101  IF(M1)260,260,261  
 260  IN1=I(L1)   
 261  CONTINUE    
      DO 270 J3=1,NSAM     
      IF(M1.LE.0)GO TO 265
CCC   IF(M1)265,265,264  
 264  J4=L1+J3-1  
      IN1=I(J4)   
 265  J5=L2+J3-1  
      I(J5)=IN1+I(J5)    
 270  CONTINUE    
      RETURN      
C     OSCILLATOR  
 102  SUM=FLOAT(I(L5))*SFI      
	IF(M1.GT.0)GO TO 281
CCC   IF(M1)280,280,281  
 280  AMP=FLOAT(I(L1))*SFI      
281	IF(M2.GT.0)GO TO 283
CCC 281  IF(M2)282,282,283  
 282  FREQ=FLOAT(I(L2))*SFI     
 283  CONTINUE    
      DO 293 J3=1,NSAM     
      J4=INT(SUM)+L4     
      F=FLOAT(I(J4))     
	IF(M2.GT.0)GO TO 286
CCC   IF(M2)285,285,286  
 285  SUM=SUM+FREQ
      GO TO 290     
 286  J4=L2+J3-1  
      SUM=SUM+FLOAT(I(J4))*SFI  
CC 290  IF(SUM-XNFUN)288,287,287  
290     IF(SUM.GE.XNFUN)GO TO 287
CC 287  SUM=SUM-XNFUN      
       IF(SUM.LT.0.0)GO TO 289
 288  J5=L3+J3-1  
	IF(M1.GT.0)GO TO 292
CCC   IF(M1)291,291,292  
 291  I(J5)=IFIX(AMP*F*SFXX)    
      GO TO 293     
C**********
287    SUM=SUM-XNFUN
       GO TO 288
289    SUM=SUM+XNFUN
       GO TO 288
C******* ABOVE FOR FM (NEG. FREQ. TO OSCIL)
 292  J6=L1+J3-1  
      I(J5)=IFIX(FLOAT(I(J6))*F*SFF)   
 293  CONTINUE    
      I(L5)=IFIX(SUM*SFID)      
      RETURN      
C     ADD TWO BOX 
103	IF(M1.GT.0)GO TO 251
CCC 103  IF(M1)250,250,251  
 250  IN1=I(L1)   
 251  IF(M2.GT.0)GO TO 253  
CCC 251  IF(M2)252,252,253  
 252  IN2=I(L2)   
 253  DO 258 J3=1,NSAM     
	IF(M1.LE.0)GO TO 255
CCC   IF(M1)255,255,254  
 254  J4=L1+J3-1  
      IN1=I(J4)   
255	IF(M2.LE.0)GO TO 257
CCC 255  IF(M2) 257,257,256 
 256  J5=L2+J3-1  
      IN2=I(J5)   
 257  J6=L3+J3-1  
      I(J6)=IN1+IN2      
 258  CONTINUE    
      RETURN      
C     RANDOM INTERPOLATING GENERATOR   
 104  SUM=FLOAT(I(L4))*SFI      
	IF(M1.GT.0)GO TO 311
CCC   IF(M1)310,310,311  
 310  XIN1=FLOAT(I(L1))*SFI     
311	IF(M2.GT.0)GO TO 313
CCC 311  IF(M2)312,312,313  
 312  XIN2=FLOAT(I(L2))*SFI     
 313  IRN1=I(L5)  
      IRN3=I(L6)  
      DO 340 J3=1,NSAM     
	IF(M1.LE.0)GO TO 316
CCC   IF(M1)316,316,315  
 315  J4=L1+J3-1  
      XIN1=FLOAT(I(J4))*SFI     
316	IF(M2.LE.0)GO TO 318
CCC 316  IF(M2)318,318,317  
 317  J5=L2+J3-1  
      XIN2=FLOAT(I(J5))*SFI     
 318  IF(SUM-XNFUN)320,319,319  
 319  SUM=SUM-XNFUN      
      I(7)=IABS (I(7)*IMULT)    
      RN4=(2.*FLOAT(I(7))*SFF-1.)
      RN2=RN4-RN3 
      RN1=RN3     
      RN3=RN4     
      GO TO 321     
 320  RN2=RN3-RN1 
 321  J7=L3+J3-1  
      I(J7)=XIN1*(RN1+(RN2*SUM)/XNFUN)*SFID   
      SUM=SUM+XIN2
 340  CONTINUE    
      I(L4)=IFIX(SUM*SFID)      
      I(L5)=IRN1  
      I(L6)=IRN3  
      RETURN      
C     ENVELOPE GENERATOR 
 105  SUM=FLOAT(I(L7))*SFI      
	IF(M1.GT.0)GO TO 381
CCC   IF(M1)380,380,381  
 380  XIN1=FLOAT(I(L1))*SFI     
381	IF(M4.GT.0)GO TO 383
CCC 381  IF(M4)382,382,383  
 382  XIN4=FLOAT(I(L4))*SFI     
383	IF(M5.GT.0)GO TO 385
CCC 383  IF(M5)384,384,385  
 384  XIN5=FLOAT(I(L5))*SFI     
385	IF(M6.GT.0)GO TO 387
CCC 385  IF(M6)386,386,387  
 386  XIN6=FLOAT(I(L6))*SFI     
 387  X1=XNFUN/4. 
      X2=2.*X1    
      X3=3.*X1    
      DO 403 J3=1,NSAM     
      J4=INT(SUM)+L2     
      F=FLOAT(I(J4))     
	IF(M1.LE.0)GO TO 405
CCC   IF(M1)405,405,404  
 404  J8=L1+J3-1 
      XIN1=FLOAT(I(J8))*SFI      
405	IF(SUM-XNFUN.LT.0)GO TO 389
CCC 405  IF(SUM-XNFUN)389,388,388   
 388  SUM=SUM-XNFUN      
389	IF(SUM-X1.GT.0)GO TO 393
CCC 389  IF(SUM-X1)390,390,393      
390	IF(M4.LE.0)GO TO 392
CCC 390  IF(M4)392,392,391  
 391  J4=L4+J3-1 
      XIN4=FLOAT(I(J4))*SFI      
 392  SUM=SUM+XIN4       
      GO TO 402    
393	IF(SUM-X2.GT.0)GO TO 397
CCC 393  IF(SUM-X2)394,394,397      
394	IF(M5.LE.0)GO TO 396
CCC 394  IF(M5)396,396,395  
 395  J5=L5+J3-1 
      XIN5=FLOAT(I(J5))*SFI      
 396  SUM=SUM+XIN5       
      GO TO 402    
397	IF(M6.LE.0)GO TO 400
CCC 397  IF(M6)400,400,399  
 399  J6=L6+J3-1 
      XIN6=FLOAT(I(J6))*SFI      
 400  SUM=SUM+XIN6       
 402  J7=L3+J3-1 
      I(J7)=IFIX(XIN1*F*SFXX)    
 403  CONTINUE   
      I(L7)=IFIX(SUM*SFID)       
      RETURN     
C     STEREO OUTPUT BOX  
106	IF(M1.GT.0)GO TO 501
CCC 106  IF(M1)500,500,501  
 500  IN1=I(L1)  
501	IF(M2.GT.0)GO TO 503
CCC 501  IF(M2)502,502,503  
 502  IN2=I(L2)  
 503  NSSAM=2*NSAM       
C  6/29/70  L.C.SMITH
      ICT=0
      DO 510 J3=1,NSSAM,2  
	IF(M1.LE.0)GO TO 505
CCC   IF(M1)505,505,504  
CC*** 504  J4=L1+J3-1 
504   J4=L1+ICT
      IN1=I(J4)  
 505  J5=L3+J3-1 
      I(J5)=IN1+I(J5)    
	IF(M2.LE.0)GO TO 507
CCC   IF(M2)507,507,506  
CC*** 506  J4=L2+J3-1 
506   J4=L2+ICT
      IN2=I(J4)  
 507  J5=L3+J3   
      I(J5)=IN2+I(J5)    
 510  ICT=ICT+1  
      RETURN     
C     ADD 3 BOX  
107	IF(M1.GT.0)GO TO 751
CCC 107  IF(M1)750,750,751  
 750  IN1=I(L1)  
751	IF(M2.GT.0)GO TO 753
CCC 751  IF(M2)752,752,753  
 752  IN2=I(L2)  
753	IF(M3.GT.0)GO TO 755
CCC 753  IF(M3)754,754,755  
 754  IN3=I(L3)  
 755  DO 780 J3=1,NSAM     
	IF(M1.LE.0)GO TO 757
CCC   IF(M1)757,757,756  
 756  J4=L1+J3-1  
      IN1=I(J4)  
757	IF(M2.LE.0)GO TO 759
CCC 757  IF(M2)759,759,758  
 758  J5=L2+J3-1 
      IN2=I(J5)  
759	IF(M3.LE.0)GO TO 761
CCC 759  IF(M3)761,761,760  
 760  J6=L3+J3-1 
      IN3=I(J6)  
 761  J7=L4+J3-1 
      I(J7)=IN1+IN2+IN3  
 780  CONTINUE   
      RETURN     
C     ADD 4 BOX  
 108  IF(M1)850,850,851  
 850  IN1=I(L1)  
 851  IF(M2)852,852,853  
 852  IN2=I(L2)  
 853  IF(M3)854,854,855  
 854  IN3=I(L3)  
 855  IF(M4)856,856,857  
 856  IN4=I(L4)  
 857  DO 880 J3=1,NSAM     
      IF(M1)859,859,858  
 858  J4=L1+J3-1 
      IN1=I(J4)  
 859  IF(M2)861,861,860  
 860  J5=L2+J3-1 
      IN2=I(J5)  
 861  IF(M3)863,863,862  
 862  J6=L3+J3-1 
      IN3=I(J6)  
 863  IF(M4)865,865,864  
 864  J7=L4+J3-1 
      IN4=I(J7)  
 865  J8=L5+J3-1 
      I(J8)=IN1+IN2+IN3+IN4      
 880  CONTINUE   
      RETURN     
C     MULTIPLIER 
 109  IF(M1)900,900,901  
 900  XIN1=FLOAT(I(L1))*SFI      
 901  IF(M2)902,902,903  
 902  XIN2=FLOAT(I(L2))*SFI      
 903  DO 908 J3=1,NSAM     
      IF(M1)905,905,904  
 904  J4=L1+J3-1 
      XIN1=FLOAT(I(J4))*SFI      
 905  IF(M2)907,907,906  
 906  J5=L2+J3-1 
      XIN2=FLOAT(I(J5))*SFI      
 907  J6=L3+J3-1 
      I(J6)=XIN1*XIN2*SFID       
 908  CONTINUE   
      RETURN     
C     SET NEW FUNCTION IN OSC OR ENV     
 110  ILOC=N1+6  
      IF(I(N1+1).EQ.105) ILOC=N1+4 
      IN1=I(3)+I(N1)-1   
      IIN1=I(IN1)/IP(12) 
      IF(IIN1)960,960,955
 955  I(ILOC)=-IP(2)-(IIN1-1)*IP(6)      
 960  RETURN     
C     RANDOM AND HOLD GENERATOR  
 111  SUM=FLOAT(I(L4))*SFI       
      IF(M1)910,910,911  
 910  XIN1=FLOAT(I(L1))*SFI      
 911  IF(M2)912,912,913  
 912  XIN2=FLOAT(I(L2))*SFI      
 913  IRN=I(L5)  
      DO 940 J3=1,NSAM     
      IF(M1)916,916,915  
 915  J4=L1+J3-1 
      XIN1=FLOAT(I(J4))*SFI      
 916  IF(M2)918,918,917  
 917  J5=L2+J3-1 
      XIN2=FLOAT(I(J5))*SFI      
 918  IF(SUM-XNFUN)920,919,919   
 919  SUM=SUM-XNFUN      
      I(7)=IABS (I(7)*IMULT)     
      RN=(2.*FLOAT(I(7))*SFF-1.)
 920  J7=L3+J3-1 
      I(J7)=XIN1*RN*SFID 
      SUM=SUM+XIN2       
 940  CONTINUE   
      I(L4)=IFIX(SUM*SFID)       
      I(L5)=IRN  
      RETURN     
      END